package com.sunrise.configuracoes.servico;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;

import lombok.Getter;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sunrise.configuracoes.repositorio.iface.NotificacaoDao;
import com.sunrise.configuracoes.repositorio.iface.PerfilDao;
import com.sunrise.configuracoes.repositorio.iface.StatusNotificacaoDao;
import com.sunrise.crm.repositorio.iface.UsuarioDao;
import com.sunrise.generico.entidade.Notificacao;
import com.sunrise.generico.entidade.Perfil;
import com.sunrise.generico.entidade.StatusNotificacao;
import com.sunrise.generico.entidade.Usuario;
import com.sunrise.generico.visao.Filtro;

@Service
@Transactional(readOnly = true)
public class ManterNotificacaoService {

	@Resource(name = "notificacaoDaoImpl")
	@Getter
	private NotificacaoDao notificacaoDAO;

	@Resource(name = "statusNotificacaoDaoImpl")
	@Getter
	private StatusNotificacaoDao statusNotificacaoDAO;

	@Resource(name = "usuarioDaoImpl")
	@Getter
	private UsuarioDao usuarioDAO;

	@Resource(name = "perfilDaoImpl")
	@Getter
	private PerfilDao perfilDAO;

	public Collection<Notificacao> buscarPorFiltros(Filtro notificacao) {
		Collection<Notificacao> notificacoes = getNotificacaoDAO().buscarPorFiltros(notificacao);
		for (Notificacao not : notificacoes) {
			not.getStatusNotificacao().size();
		}
		return notificacoes;
	}

	public Collection<Perfil> listarPerfis() {
		return getPerfilDAO().listarOrdenado();
	}

	public List<Usuario> listarUsuariosPorFiltro(Filtro filtro) {
		return getUsuarioDAO().buscarPorFiltros(filtro);
	}

	public Collection<Usuario> listarUsuarioPorNome(String nome) {
		return getUsuarioDAO().listarPorNome(nome);
	}

	public Collection<StatusNotificacao> adicionarUsuariosSelecionados(Usuario[] usuariosSelecionados,
			Notificacao notificacao) {
		Collection<StatusNotificacao> status = new ArrayList<StatusNotificacao>();
		for (Usuario user : usuariosSelecionados) {
			Boolean inserido = false;
			if (!notificacao.getStatusNotificacao().isEmpty()) {
				for (StatusNotificacao nStatus : notificacao.getStatusNotificacao()) {
					if (nStatus.getUsuario().getId().equals(user.getId())) {
						inserido = true;
					}
				}
			}
			if (!inserido) {
				StatusNotificacao statusNotificacao = new StatusNotificacao();
				statusNotificacao.setUsuario(user);
				statusNotificacao.setNotificacao(notificacao);
				status.add(statusNotificacao);
			}
		}

		return status;
	}

	public Perfil buscarPerfilPorId(Perfil perfil) {
		return getPerfilDAO().getById(perfil.getId());
	}

	@Transactional(readOnly = false)
	public void salvar(Notificacao entidade) {
		if (entidade.getPerfis() != null && !entidade.getPerfis().isEmpty()) {
			for (Perfil perfil : entidade.getPerfis()) {
				Collection<Usuario> usuarios = getUsuarioDAO().listarPorPerfil(perfil.getId());
				StatusNotificacao not = null;
				if (entidade.getStatusNotificacao() == null) {
					entidade.setStatusNotificacao(new ArrayList<StatusNotificacao>());
				}

				for (Usuario usuario : usuarios) {
					not = new StatusNotificacao();
					;
					not.setUsuario(usuario);
					not.setNotificacao(entidade);
					Boolean unico = true;
					for (StatusNotificacao status : entidade.getStatusNotificacao()) {
						if (not.getUsuario().getId().equals(status.getUsuario().getId())) {
							unico = false;
						}
					}
					if (unico) {
						entidade.getStatusNotificacao().add(not);
					}
				}

			}
		}
		entidade.setPerfis(null);
		
		
		for (StatusNotificacao status : entidade.getStatusNotificacao()) {

			getStatusNotificacaoDAO().inserir(status);
		}
		getNotificacaoDAO().inserir(entidade);

	}
}